home *** CD-ROM | disk | FTP | other *** search
- {
- FRANCOIS THUNUS
-
- > Would it be possible to throw a [Ctrl-Alt-Del] into the keyboard buffer,
- > causing Smartdrv to Write its data and warm boot the computer? if so, any
- > ideal how a person would do this?
-
- trap keyboard info
- if ctr-alt-del then begin
- check For smrtdrv
- if smrtdrv then flush cache
- reboot
- end;
-
- Flush cache: (was posted here but since it is more than a month old, i guess
- it's ok to repost ?):
- }
-
- Unit SfeCache;
- {
-
- Max Maischein Sunday, 7.03.1993
- 2:249/6.17 Frankfurt, GER
-
- This Unit implements an automatic flush For installed
- Write-behind caches like SmartDrive and PC-Cache. It's based on
- cache detection code by Norbert Igl, I added the calls to flush
- the buffers. The stuff is only tested For SMARTDRV.EXE, the rest
- relies on Norbert and the INTERRUP.LST from Ralf Brown.
-
- Al says : "Save early, save often !"
-
- The Unit exports one Procedure, FlushCache, this flushes the
- first cache found. It could be good to flush everything on
- Program termination, since users are likely to switch off their
- computers directly upon Exit from the Program.
-
- This piece of code is donated to the public domain, but I request
- that, if you use this code, you mention me in the DOCs somewhere.
- -max
- }
- Interface
-
- Implementation
-
- Uses
- Dos;
-
- Const
- AktCache : Byte = 0;
-
- Type
- FlushProc = Procedure;
-
- Var
- FlushCache : FlushProc;
-
- Function SmartDrv_exe : Boolean;
- Var
- Found : Boolean;
- begin
- Found := False;
- Asm
- push bp
- stc
- mov ax, 4A10h
- xor bx, bx
- int 2Fh
- pop bp
- jc @NoSmartDrive
- cmp ax, 0BABEh
- jne @NoSmartDrive
- mov Found, True
- @NoSmartDrive:
- end;
- SmartDrv_exe := Found;
- end;
-
- Function SmartDrv_sys : Boolean;
- Var
- F : File;
- B : Array[0..$27] of Byte; { return Buffer }
- OK : Boolean;
- Const
- S = SizeOf( B );
- begin
- SmartDrv_sys := False;
- OK := False;
- { -------Check For SmartDrv.SYS----------- }
- Assign(f,'SMARTAAR');
- {$I-}
- Reset( F );
- {$I+}
- if IoResult <> 0 then
- Exit; { No SmartDrv }
- FillChar( B, Sizeof(B), 0 );
- Asm
- push ds
- mov ax, 4402h
- mov bx, TextRec( F ).Handle
- mov cx, S
- mov dx, seg B
- mov ds, dx
- mov dx, offset B
- int 21h
- jc @Error
- mov OK, 1
- @Error:
- pop ds
- end;
- close(f);
- SmartDrv_sys := OK;
- end;
-
- Function CompaqPro : Boolean;
- Var
- OK : Boolean;
- begin
- CompaqPro := False;
- OK := False;
- Asm
- mov ax, 0F400h
- int 16h
- cmp ah, 0E2h
- jne @NoCache
- or al, al
- je @NoCache
- cmp al, 2
- ja @NoCache
- mov OK, 1
- @NoCache:
- end;
- CompaqPro := OK;
- end;
-
- Function PC6 : Boolean; { PCTools v6, v5 }
- Var
- OK : Boolean;
- begin
- PC6 := False;
- OK := False;
- Asm
- mov ax, 0FFA5h
- mov cx, 01111h
- int 16h
- or ch, ch
- jne @NoCache
- mov OK, 1
- @NoCache:
- end;
- PC6 := OK;
- end;
-
- Function PC5 : Boolean;
- Var
- OK : Boolean;
- begin
- PC5 := False;
- OK := False;
- Asm
- mov ax, 02BFFh
- mov cx, 'CX';
- int 21h
- or al, al
- jne @NoCache
- mov ok, 1
- @NoCache:
- end;
- PC5 := OK;
- end;
-
- Function HyperDsk : Boolean; { 4.20+ ... }
- Var
- OK : Boolean;
- begin
- Hyperdsk := False;
- OK := False;
- Asm
- mov ax, 0DF00h
- mov bx, 'DH'
- int 02Fh
- cmp al, 0FFh
- jne @NoCache
- cmp cx, 05948h
- jne @NoCache
- mov OK, 1
- @NoCache:
- end;
- HyperDSK := OK;
- end;
-
- Function QCache : Boolean;
- Var
- OK : Boolean;
- begin
- QCache := False;
- OK := False;
- Asm
- mov ah, 027h
- xor bx, bx
- int 013h
- or bx, bx
- je @NoCache
- mov OK, 1
- @NoCache:
- end;
- QCache := OK;
- end;
-
- Procedure FlushSD_sys; Far;
- Var
- F : File;
- B : Byte;
- begin
- Assign(F, 'SMARTAAR');
- Reset(F);
- B := 0;
- Asm
- push ds
- mov ax, 04403h
- mov bx, FileRec(F).Handle
- mov cx, 1
- int 21h
- pop ds
- end;
- end;
-
- Procedure FlushSD_exe; Far; Assembler;
- Asm
- mov ax, 04A10h
- mov bx, 1
- int 2Fh
- end;
-
- Procedure FlushPC6; Far; Assembler;
- Asm
- mov ax, 0F5A5h
- mov cx, -1
- int 16h
- end;
-
- Procedure FlushPC5; Far; Assembler;
- Asm
- mov ah, 0A1h
- mov si, 04358h
- int 13h
- end;
-
- Procedure FlushNoCache; Far;
- begin
- end;
-
- begin
- if SmartDrv_exe then
- FlushCache := FlushSD_exe
- else
- if SmartDrv_sys then
- FlushCache := FlushSD_sys
- else
- if PC6 then
- FlushCache := FlushPC6
- else
- if PC5 then
- FlushCache := FlushPC5
- else
- FlushCache := FlushNoCache;
-
- FlushCache;
- end.